<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>
        // 函数的闭包与链式调用
        var foo = function(...args){
            const fn = function() {
                // 将arguments 转化为真实的数组
                const arg = Array.prototype.slice.call(arguments);
                // concat()方法是用于连接两个或多个数组 并且不会改变现有的数组
                // 拼接上一次调用的参数
                args = args.concat(arg);
                // 将拼接后的新数组重新传入foo()函数中 达到链式调用 
                return foo(...args);
            };
            // 添加方法
            fn.getValue = () => {
                // 返回累积相加后的数
                return args.reduce((pre,cur) => {
                    return pre + cur;
                },0);
            };
            // 闭包返回函数名
            return fn;
        };
        var f1 = foo(1)(4,5);
        console.log(f1.getValue());
    </script>
</body>
</html>